چه وقتی از نخهای دستگیره به کارگیری کنیم؟
نخهای دستگیره راه حلهایی بهتر برای اجرای شغل های پسمورد با فرصت اجرای زمان بر می باشند که طراحی اپلیکیشن در مشهد مستلزم بهروزرسانی UI نیستند.
ThreadPoolExecutor
دراین قسمت به رسیدگی «استخر نخ» (Thread Pool) میپردازیم.
استخر نخ چیست؟
خواسته از استخر نخ در واقع یک دسته از نخها میباشد که درانتظار ارائه یک وظیفه میباشند. وظیفهای که بهاین نخها انتساب می یابد به طور برابر اعمال شود. ازآنجاکه این وظایف به طور برابر ایفا می شوند، ممکن میباشد بخواهیم مطمئن شویم که کدمان از حیث نخ ایمن میباشد. یک استخر نخ به صورت عمده به حل دو ایراد تحت یاری مینماید:
پیشرفت در عملکرد در طول اجرای یک دسته تعالی از وظایف ناهمگام به جهت کاهش سربار هر وظیفه.
ابزاری برای کراندار کردن و مدیر منابع (دربرگیرنده نخها) در طول اجرای دستهای از وظایف.
نمونه ذیل را در حیث بگیرید:
در حالتیکه 40 تصویر BMP داشته باشیم که بخواهیم دیکد کنیم و هر bitmap برای دیکد شدن به 4 میلیثانیه فرصت نیاز داشته باشد. چنانچه این فعالیت را روی یک نخ منفرد اعمال کنیم، در کل 160 میلیثانیه برای دیکد کردن کلیه بیتمپها نیاز داریم. با این هم اکنون درحالتی که این فعالیت را با 10 نخ ایفا دهیم، هر مورد چهار بیتمپ را دیکد مینماید و از این رو فرصت ما یحتاج برای دیکد کردن این 40 بیتمپ موازی با صرفا 16 میلیثانیه خواهد بود.
ایراد این میباشد که امور را چهطور به هر نخ ارسال کنیم، مجالبندی عمل به چه شکل باشد و چه طور این نخها را رئیس کنیم. این اختلال بسیار بزرگی میباشد. این دقیقاً به عبارتی جایی میباشد که ThreadPoolExecutor وارد فعالیت میگردد.
ThreadPoolExecutor چیست؟
ThreadPoolExecutor یک کلاس میباشد که AbstractExecutorService (+) را گسترش می دهد. ThreadPoolExecutor وظیفه نگهداری از کلیه نخها را بر ذمه دارااست:
وظایف را به نخها تحویل می دهد.
آنانرا زنده نگاه میدارد.
نخها را خاتمه میبخشد.
نحوه عمل ThreadPoolExecutor در پسمورد این سیرتکامل میباشد که وظایفی که بایستی ایفا شوند، در صف فعالیت مراقبت می شوند. هر وظیفه در هنگامی که یک نخ در استخر نخ آزاد یا این که جان دار میگردد، از صف عمل به آن نخ انتساب می یابد.
Runnable
Runnable یک اینترفیس میباشد که بایستی از سوی یک کلاس پیادهسازی گردد. دفعههای این کلاس به خواسته اجرای یک نخ گزینه به کار گیری قرار می گیرند. به ذکر بی آلایش Runnable یک وظیفه یا این که امر میباشد که می بایست اعمال گردد. از این اینترفیس به صورت مکرر برای اجرای کد در نخهای متفاوت استعمال میشود.
1Runnable mRunnable = new Runnable() {
2 @Override
3 public void run() {
4 // Do some work
5 }
6};
Executor
Executor نیز یک اینترفیس میباشد که برای جداسازی تحویل یک وظیفه از اجرای وظیفه آیتم به کارگیری قرار میگیرد. غرض آن اجرای یک Runnable میباشد.
1Executor mExecutor = Executors.newSingleThreadExecutor(); mExecutor.execute(mRunnable);
ExecutorService
یک Executor میباشد که به مدیر وظایف ناهمگام می پردازد.
1ExecutorService mExecutorService = Executors.newFixedThreadPool(10); mExecutorService.execute(mRunnable);
ThreadPoolExecutor
ThreadPoolExecutor یک ExecutorService میباشد که وظایف را به نخ استخرها انتساب می دهد. وجود تعداد متعددی نخ در اکثر زمان ها مورد ها چندان بهتر وجود ندارد، چون CPU فقط تعداد مشخصی از نخها را می تواند به طور برابر انجام نماید. هنگامی که تعداد نخها از این تعداد تجاوز نماید، CPU می بایست محاسبات پرهزینهای انجام نماید تا درباره ی این که کدام نخ بایستی مطابق حق تقدم انتساب یابد، تصمیم بگیرد.
ما در طی تولید دفعهای از ThreadPoolExecutor میتوانیم تعداد نخهای اول و تعداد نخهای بیشینه آن را انتخاب کنیم از آنجا که توشهِ کاری در استخر نخ متغیر میباشد، تعداد نخهای زنده برای تطبیق با این حالت تغییر تحول می یابد. به صورت معمول توصیه میشود که نخها بر مبنای تعداد هستههای جانور اختصاص یابند. این عمل به طور پایین اعمال میگردد:
1int NUMBER_OF_CORES = Runtime.getRuntime().availableProcessors();
نکته: این فرمان لزوماً تعداد حقیقی و واقعی هستههای فیزیکی روی دستگاه را رجوع و برگشت نمیدهد. ممکن میباشد CPU بعضا هستهها را برای ذخیره باتری غیر فعال کرده باشد و یا این که گزینه دیگری وجود داشته باشد.
1ThreadPoolExecutor(
2 int corePoolSize, // Initial pool size
3 int maximumPoolSize, // Max pool size
4 long keepAliveTime, // Time idle thread waits before terminating
5 TimeUnit unit // Sets the Time Unit for keepAliveTime
6 BlockingQueue workQueue) // Work Queue
این پارامترها بدین مفهوم می باشند:
corePoolSize – کمینه تعداد نخهایی که در استخر محافظت می گردند. در صدر صفر نخ در استخر وجود داراهستند. البته وقتی که وظایف به صف اضافه می گردند، نخهای تازه ساختوساز میگردند. در صورتی تعداد نخهای اجرایی از corePoolSize کمتر باشد، Executor همواره ترجیح میدهد که به مکان صفبندی، نخ جدیدی بیفزاید.
maximumPoolSize – بیشینه تعداد نخهای مجاز در استخر میباشند. درحالتی که این مقدار از corePoolSize تجاوز نماید، و تعداد کنونی نخها گرانقدرخیس یا این که موازی با corePoolSize باشد، نخهای کاری تازه فقط در حالتیکه ساختوساز میگردند که صف مالامال باشد.
keepAliveTime – هنگامی که تعداد نخها گران قدرخیس از تعداد هستهها باشد، نخهای غیر هسته (اضافی نخهای بی کار) معطل وظیفه نو می مانند و در حالتیکه در طول فرصت انتخابگردیده از سوی این پارامتر وظیفهای اخذ نکنند، خاتمه خواهند یافت.
Unit – واحد هنگامی برای keepAliveTime میباشد.
workQueue – صف کاری میباشد که فقط وظایف runnable را محافظت مینماید. این صف بایستی از نوع BlockingQueue (+) باشد.
چه هنگامی از ThreadPoolExecutor به کارگیری کنیم؟
ThreadPoolExecutor یک چارچوب اجرای وظیفه حاذق میباشد. از آن میقدرت در طول وجود تعداد بالایی از وظایف که بایستی به طور برابر جاری ساختن شوند استفاده نمود زیرا ThreadPoolExecutor از افزودن وظیفه به صف، کنسل وظیفه و حق تقدمبندی وظایف دفاع مینماید.
IntentService
IntentService یک زیرکلاس به ارث رسیده از Service میباشد. برای این که IntentService را بشناسیم بایستی آغاز Service را بشناسیم. Service یک کامپوننت بسیار اساسی در نرم افزارنویسی اندروید محسوب میشود. بعضی اوقات ممکن میباشد وظیفهای داشته باشیم که می بایست حتی بعداز مسدود شدن نرم افزار نیز ایفا خواهد شد. دراینصورت از Service به کار گیری می کنیم. Service قادر است از سوی ()startService اعمال گردیده و با ()stopService متوقف خواهد شد و برای مدتی زمان بر در پسقضیه انجام خواهد شد. همینطور یک خدمت را میاقتدار با فراخوانی ()stopSelf در درونش کنسل کرد.
بهدنبال بعضی از متدهای override گردیده که برای اجرای عملیات متعدد موءثر میباشند را می بینید:
()onCreate – صرفا یک توشه فراخوانی گردد تا این که خدمت متوقف گردد.
()onStartCommand – این تابع بعد از ()onCreate برای اول توشه فراخوانی می گردد، البته می تواند مستقیماً هر فرصت که کامپوننتی ()startService را با اینتنت فراخوانی مینماید، از توشه دوم به آنگاه آیتم فراخوانی قرار گیرد.
()onDestroy – در حین توقف خدمت فراخوانی می گردد.
گردش نرمال یک خدمت به طور تحت میباشد:
onCreate() -> onStartCommand() -> onDestroy()
در صورتیکه به گفت و گو IntentService بازگردیم، بایستی بگوییم که Service به طور نرمال شروع می شود، یعنی ()startService را از نخ اساسی فراخوانی می کنیم. این خدمت به مکان ()onStartCommand هر اینتنت که در ()onHandleIntent باشد را رئیس مینماید. همینطور از یک نخ کاری به کار گیری مینماید و هنگامی که عمل نقطه پایان یابد خویش را متوقف مینماید. برای به کار گیری از آن بایستی IntentService را توسعه و گسترش داده و ()onHandleIntent را پیادهسازی نمایید.
نکته: IntentService روی یک نخ کاری منفرد اعمال میگردد، در حالی که Service روی نخ اساسی اعمال میگردد. هر توشه صرفا یک درخواست پردازش میشوند.
IntentService تابع کلیه محدودیتهای اجرایی پسقضیه میباشد که از سوی اندروید 8.0 (سطح API 26) رقم خورده میباشد. در اکثر وقت ها مفاد عالی میباشد از JobIntentService (+) به کار گیری نمایید که در طی انجام روی اندروید 8 و فراتر از job-ها به مکان خدمتها به کار گیری مینماید.
چه وقتی از نخهای دستگیره به کارگیری کنیم؟
نخهای دستگیره راه حلهایی بهتر برای اجرای شغل های پسمورد با فرصت اجرای زمان بر می باشند که طراحی اپلیکیشن در مشهد مستلزم بهروزرسانی UI نیستند.
ThreadPoolExecutor
دراین قسمت به رسیدگی «استخر نخ» (Thread Pool) میپردازیم.
استخر نخ چیست؟
خواسته از استخر نخ در واقع یک دسته از نخها میباشد که درانتظار ارائه یک وظیفه میباشند. وظیفهای که بهاین نخها انتساب می یابد به طور برابر اعمال شود. ازآنجاکه این وظایف به طور برابر ایفا می شوند، ممکن میباشد بخواهیم مطمئن شویم که کدمان از حیث نخ ایمن میباشد. یک استخر نخ به صورت عمده به حل دو ایراد تحت یاری مینماید:
پیشرفت در عملکرد در طول اجرای یک دسته تعالی از وظایف ناهمگام به جهت کاهش سربار هر وظیفه.
ابزاری برای کراندار کردن و مدیر منابع (دربرگیرنده نخها) در طول اجرای دستهای از وظایف.
نمونه ذیل را در حیث بگیرید:
در حالتیکه 40 تصویر BMP داشته باشیم که بخواهیم دیکد کنیم و هر bitmap برای دیکد شدن به 4 میلیثانیه فرصت نیاز داشته باشد. چنانچه این فعالیت را روی یک نخ منفرد اعمال کنیم، در کل 160 میلیثانیه برای دیکد کردن کلیه بیتمپها نیاز داریم. با این هم اکنون درحالتی که این فعالیت را با 10 نخ ایفا دهیم، هر مورد چهار بیتمپ را دیکد مینماید و از این رو فرصت ما یحتاج برای دیکد کردن این 40 بیتمپ موازی با صرفا 16 میلیثانیه خواهد بود.
ایراد این میباشد که امور را چهطور به هر نخ ارسال کنیم، مجالبندی عمل به چه شکل باشد و چه طور این نخها را رئیس کنیم. این اختلال بسیار بزرگی میباشد. این دقیقاً به عبارتی جایی میباشد که ThreadPoolExecutor وارد فعالیت میگردد.
ThreadPoolExecutor چیست؟
ThreadPoolExecutor یک کلاس میباشد که AbstractExecutorService (+) را گسترش می دهد. ThreadPoolExecutor وظیفه نگهداری از کلیه نخها را بر ذمه دارااست:
وظایف را به نخها تحویل می دهد.
آنانرا زنده نگاه میدارد.
نخها را خاتمه میبخشد.
نحوه عمل ThreadPoolExecutor در پسمورد این سیرتکامل میباشد که وظایفی که بایستی ایفا شوند، در صف فعالیت مراقبت می شوند. هر وظیفه در هنگامی که یک نخ در استخر نخ آزاد یا این که جان دار میگردد، از صف عمل به آن نخ انتساب می یابد.
Runnable
Runnable یک اینترفیس میباشد که بایستی از سوی یک کلاس پیادهسازی گردد. دفعههای این کلاس به خواسته اجرای یک نخ گزینه به کار گیری قرار می گیرند. به ذکر بی آلایش Runnable یک وظیفه یا این که امر میباشد که می بایست اعمال گردد. از این اینترفیس به صورت مکرر برای اجرای کد در نخهای متفاوت استعمال میشود.
1Runnable mRunnable = new Runnable() {
2 @Override
3 public void run() {
4 // Do some work
5 }
6};
Executor
Executor نیز یک اینترفیس میباشد که برای جداسازی تحویل یک وظیفه از اجرای وظیفه آیتم به کارگیری قرار میگیرد. غرض آن اجرای یک Runnable میباشد.
1Executor mExecutor = Executors.newSingleThreadExecutor(); mExecutor.execute(mRunnable);
ExecutorService
یک Executor میباشد که به مدیر وظایف ناهمگام می پردازد.
1ExecutorService mExecutorService = Executors.newFixedThreadPool(10); mExecutorService.execute(mRunnable);
ThreadPoolExecutor
ThreadPoolExecutor یک ExecutorService میباشد که وظایف را به نخ استخرها انتساب می دهد. وجود تعداد متعددی نخ در اکثر زمان ها مورد ها چندان بهتر وجود ندارد، چون CPU فقط تعداد مشخصی از نخها را می تواند به طور برابر انجام نماید. هنگامی که تعداد نخها از این تعداد تجاوز نماید، CPU می بایست محاسبات پرهزینهای انجام نماید تا درباره ی این که کدام نخ بایستی مطابق حق تقدم انتساب یابد، تصمیم بگیرد.
ما در طی تولید دفعهای از ThreadPoolExecutor میتوانیم تعداد نخهای اول و تعداد نخهای بیشینه آن را انتخاب کنیم از آنجا که توشهِ کاری در استخر نخ متغیر میباشد، تعداد نخهای زنده برای تطبیق با این حالت تغییر تحول می یابد. به صورت معمول توصیه میشود که نخها بر مبنای تعداد هستههای جانور اختصاص یابند. این عمل به طور پایین اعمال میگردد:
1int NUMBER_OF_CORES = Runtime.getRuntime().availableProcessors();
نکته: این فرمان لزوماً تعداد حقیقی و واقعی هستههای فیزیکی روی دستگاه را رجوع و برگشت نمیدهد. ممکن میباشد CPU بعضا هستهها را برای ذخیره باتری غیر فعال کرده باشد و یا این که گزینه دیگری وجود داشته باشد.
1ThreadPoolExecutor(
2 int corePoolSize, // Initial pool size
3 int maximumPoolSize, // Max pool size
4 long keepAliveTime, // Time idle thread waits before terminating
5 TimeUnit unit // Sets the Time Unit for keepAliveTime
6 BlockingQueue workQueue) // Work Queue
این پارامترها بدین مفهوم می باشند:
corePoolSize – کمینه تعداد نخهایی که در استخر محافظت می گردند. در صدر صفر نخ در استخر وجود داراهستند. البته وقتی که وظایف به صف اضافه می گردند، نخهای تازه ساختوساز میگردند. در صورتی تعداد نخهای اجرایی از corePoolSize کمتر باشد، Executor همواره ترجیح میدهد که به مکان صفبندی، نخ جدیدی بیفزاید.
maximumPoolSize – بیشینه تعداد نخهای مجاز در استخر میباشند. درحالتی که این مقدار از corePoolSize تجاوز نماید، و تعداد کنونی نخها گرانقدرخیس یا این که موازی با corePoolSize باشد، نخهای کاری تازه فقط در حالتیکه ساختوساز میگردند که صف مالامال باشد.
keepAliveTime – هنگامی که تعداد نخها گران قدرخیس از تعداد هستهها باشد، نخهای غیر هسته (اضافی نخهای بی کار) معطل وظیفه نو می مانند و در حالتیکه در طول فرصت انتخابگردیده از سوی این پارامتر وظیفهای اخذ نکنند، خاتمه خواهند یافت.
Unit – واحد هنگامی برای keepAliveTime میباشد.
workQueue – صف کاری میباشد که فقط وظایف runnable را محافظت مینماید. این صف بایستی از نوع BlockingQueue (+) باشد.
چه هنگامی از ThreadPoolExecutor به کارگیری کنیم؟
ThreadPoolExecutor یک چارچوب اجرای وظیفه حاذق میباشد. از آن میقدرت در طول وجود تعداد بالایی از وظایف که بایستی به طور برابر جاری ساختن شوند استفاده نمود زیرا ThreadPoolExecutor از افزودن وظیفه به صف، کنسل وظیفه و حق تقدمبندی وظایف دفاع مینماید.
IntentService
IntentService یک زیرکلاس به ارث رسیده از Service میباشد. برای این که IntentService را بشناسیم بایستی آغاز Service را بشناسیم. Service یک کامپوننت بسیار اساسی در نرم افزارنویسی اندروید محسوب میشود. بعضی اوقات ممکن میباشد وظیفهای داشته باشیم که می بایست حتی بعداز مسدود شدن نرم افزار نیز ایفا خواهد شد. دراینصورت از Service به کار گیری می کنیم. Service قادر است از سوی ()startService اعمال گردیده و با ()stopService متوقف خواهد شد و برای مدتی زمان بر در پسقضیه انجام خواهد شد. همینطور یک خدمت را میاقتدار با فراخوانی ()stopSelf در درونش کنسل کرد.
بهدنبال بعضی از متدهای override گردیده که برای اجرای عملیات متعدد موءثر میباشند را می بینید:
()onCreate – صرفا یک توشه فراخوانی گردد تا این که خدمت متوقف گردد.
()onStartCommand – این تابع بعد از ()onCreate برای اول توشه فراخوانی می گردد، البته می تواند مستقیماً هر فرصت که کامپوننتی ()startService را با اینتنت فراخوانی مینماید، از توشه دوم به آنگاه آیتم فراخوانی قرار گیرد.
()onDestroy – در حین توقف خدمت فراخوانی می گردد.
گردش نرمال یک خدمت به طور تحت میباشد:
onCreate() -> onStartCommand() -> onDestroy()
در صورتیکه به گفت و گو IntentService بازگردیم، بایستی بگوییم که Service به طور نرمال شروع می شود، یعنی ()startService را از نخ اساسی فراخوانی می کنیم. این خدمت به مکان ()onStartCommand هر اینتنت که در ()onHandleIntent باشد را رئیس مینماید. همینطور از یک نخ کاری به کار گیری مینماید و هنگامی که عمل نقطه پایان یابد خویش را متوقف مینماید. برای به کار گیری از آن بایستی IntentService را توسعه و گسترش داده و ()onHandleIntent را پیادهسازی نمایید.
نکته: IntentService روی یک نخ کاری منفرد اعمال میگردد، در حالی که Service روی نخ اساسی اعمال میگردد. هر توشه صرفا یک درخواست پردازش میشوند.
IntentService تابع کلیه محدودیتهای اجرایی پسقضیه میباشد که از سوی اندروید 8.0 (سطح API 26) رقم خورده میباشد. در اکثر وقت ها مفاد عالی میباشد از JobIntentService (+) به کار گیری نمایید که در طی انجام روی اندروید 8 و فراتر از job-ها به مکان خدمتها به کار گیری مینماید.

منزلت تبلیغ در حاصل گوگل